/*================================================================================
*
*
*
*
*
* 项目名称:  210605F7LVGL
* 文件名称:  LCD.c
* 创建日期:  2021年7月31日
* 文件描述:
*
================================================================================*/
#include "stm32f767xx.h"
#include "dma2d.h"
#include "LCD.h"

#define LCD_LAYER0_ADR                ((uint32_t *)0xD0000000)
//#define LCD_LAYER1_ADR                ((uint32_t *)0xD0177000)

uint32_t u32Color=0xFF05FF05;

/********************************************************************************
*函数功能:
  测试DMA2D功能
*修改记录:
*日期:                             作者:                             摘要:
      2021年7月31日      YummoShin         Create
********************************************************************************/
void LcdTest(void)
{
  hdma2d.Init.OutputOffset = 0;
  hdma2d.Init.Mode = DMA2D_R2M;
  HAL_DMA2D_Init(&hdma2d);

  HAL_DMA2D_Start(&hdma2d, (uint32_t)0xFF00FF00, (uint32_t)LCD_LAYER0_ADR, 800, 480);
  HAL_DMA2D_PollForTransfer(&hdma2d, 100);
}

/********************************************************************************
*函数功能:
*修改记录:
*日期:                             作者:                             摘要:
      2021年8月11日      YummoShin         Create
********************************************************************************/
void LcdDmaFill(uint32_t x, uint32_t y, uint32_t u32Width, uint32_t u32Height, uint32_t u32ARGB)
{
  uint32_t u32DstAddr=(uint32_t)LCD_LAYER0_ADR+x*4+y*800*4;

  hdma2d.Init.OutputOffset = 800-u32Width;
  hdma2d.Init.Mode = DMA2D_R2M;
  HAL_DMA2D_Init(&hdma2d);

  HAL_DMA2D_Start(&hdma2d, u32ARGB, u32DstAddr, u32Width, u32Height);
  HAL_DMA2D_PollForTransfer(&hdma2d, 100);
}

/********************************************************************************
*函数功能:
*修改记录:
*日期:                             作者:                             摘要:
      Aug 14, 2021      YummoShin         Create
********************************************************************************/
void LcdDmaFillArea(uint32_t x0, uint32_t x1, uint32_t y0, uint32_t y1, uint32_t u32BufAdr, uint32_t u32BufWidth, uint32_t u32ARGB)
{
  uint32_t u32DstAddr = u32BufAdr+y0*u32BufWidth*4+x0*4;
  uint32_t u32W=x1-x0+1, u32H=y1-y0+1;

  hdma2d.Init.OutputOffset = u32BufWidth-u32W;
  hdma2d.Init.Mode = DMA2D_R2M;
  HAL_DMA2D_Init(&hdma2d);

  HAL_DMA2D_Start(&hdma2d, u32ARGB, u32DstAddr, u32W, u32H);
  HAL_DMA2D_PollForTransfer(&hdma2d, 100);
}

/********************************************************************************
*函数功能:
*修改记录:
*日期:                             作者:                             摘要:
      2021年8月12日      YummoShin         Create
********************************************************************************/
void LcdDmaCopy(uint32_t x, uint32_t y, uint32_t u32W, uint32_t u32H, uint32_t u32BufStaAdr)
{
  uint32_t u32DstAddr=(uint32_t)LCD_LAYER0_ADR+x*4+(y*800*4);

  hdma2d.Instance = DMA2D;
  hdma2d.Init.OutputOffset = 800-u32W;
  hdma2d.Init.Mode = DMA2D_M2M;
  hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
  hdma2d.Init.AlphaInverted = DMA2D_REGULAR_ALPHA;
  hdma2d.Init.RedBlueSwap = DMA2D_RB_REGULAR;

  hdma2d.LayerCfg[1].InputOffset = 0;
  hdma2d.LayerCfg[1].AlphaInverted = DMA2D_NO_MODIF_ALPHA;
  hdma2d.LayerCfg[1].AlphaMode = DMA2D_REGULAR_ALPHA;
  hdma2d.LayerCfg[1].InputAlpha = 0xFF;
  hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888;
  hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;

  HAL_DMA2D_Init(&hdma2d);
  HAL_DMA2D_ConfigLayer(&hdma2d, 1);

  HAL_DMA2D_Start(&hdma2d, u32BufStaAdr, u32DstAddr, u32W, u32H);
  HAL_DMA2D_PollForTransfer(&hdma2d, 200);
}
